#ifndef NUC_COMMU_H
#define NUC_COMMU_H

#include "struct_typedef.h"
#include "debugConfig.h"

#define SEND_START 'S'          //开始标志
#define SEND_END 'E'            //结束标志

#define NUCINFO_RX_BUF_NUM 2*sizeof(toSTM32_t)

#define NUCINFO_FRAME_LENGTH sizeof(toSTM32_t)

typedef struct
{
    uint8_t start : 8; // 开始符号，'S'
    int8_t pitchUp : 8; // 云台旋转动作，向上为正
    int8_t pitchDown : 8; // 云台旋转动作，向上为正
    uint8_t reserved : 8; // 保留位,默认为0
    int16_t yawUp : 16; // 云台旋转动作，逆时针为正
    int16_t yawDown : 16; // 云台旋转动作，逆时针为正
    int16_t x : 16; // 云台坐标系下,底盘的x速度
    int16_t y : 16; // 云台坐标系下,底盘的y速度
    int16_t w : 16; // 云台坐标系下,底盘的角速度w
    uint8_t shootUp : 8; // 是否发射（拨弹轮启动)
    uint8_t shootDown : 8; // 是否发射（拨弹轮启动)
    uint8_t checksum : 8; // 校验和
    uint8_t end : 8;      // 结尾标志符号，'E'
} toSTM32_t;

enum my_color_enum {
    COLOR_RED   = 0,
    COLOR_BLUE  = 1,
};

#ifdef TEST_USART
typedef toSTM32_t toNUC_t ;
#else 
typedef struct
{
    uint32_t start;                 // 开始符号，'S'
    uint32_t blood : 12;            // 剩余血量，不会高于4096
    uint32_t bullet_remaining : 12; // 剩余子弹，不会高于4096
    uint32_t my_color : 8;          // 本方颜色，32bit对齐
    uint32_t checksum;              // 校验和，前方所有数据按32bit分段直接相加
    uint32_t end;                   // 结束符号，'E'
}toNUC_t;
#endif
//初始化从nuc接收信息
extern void nuc_control_init(void);

// 获取控制存储好的nuc信息的指令
extern const toSTM32_t *get_nuc_control_point(void);


//找到了返回1，未找到则返回0.当发送的数据起始为'S'则为找到
int foundArmor(void);

//标记数据的接收状态
// 设置有效
void NUCSetReadMark(void);

// 设置NUC数据无效
void NUCClearReadMark(void);

// 判断NUC数据是否有效
int NUCisAvailable(void);


//标记数据的接收状态
//云台
void gimbal_set_read_mark(void);

void gimbal_clear_read_mark(void);

int gimbal_NUC_is_available(void);
//发射
void shoot_set_read_mark(void);

void shoot_clear_read_mark(void);

int shoot_NUC_is_available(void);

void to_nuc_send_task(void const *pvParameters);

#endif // !NUC_COMMU_H
